/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.lcfgly.util;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;

/**
 *
 * @author lcfgly
 */
public class ImageUtil {
    
    /**
     * 缩放图片选取，原图片截取
     * @param srcpath 原始图片file
     * @param topath 输出图片file
     * @param readImageFormat 图片类型("jpg","png"....)
     * @param x1 左上角x坐标
     * @param y1 左上角y坐标
     * @param x2 右下角x坐标
     * @param y2 右下脚y坐标
     * @param w 选取图片宽度
     * @param h 选取图片高度
     * @throws IOException 
     */
    public static void CutImageXY(File srcpath,File topath,String readImageFormat, int x1, int y1, int x2, int y2, int w, int h) throws IOException {
        if (srcpath == null || x1 == x2 || y1 == y2) {
            return ;
        }
        BufferedImage src = ImageIO.read(srcpath);
        int srcw = src.getWidth();
        int srch = src.getHeight();
        //截取x2图片宽度,截取图片高度y2
        x2 = (x2 - x1) * srcw / w;
        y2 = (y2 - y1) * srch / h;
        //未缩放原始点
        x1 = (int) (x1 * srcw) / w;
        y1 = (int) (y1 * srch) / h;
        cutimg(srcpath, topath, readImageFormat, x1, y1, x2, y2);
    }
    
    /**
     * 缩放图片选取，原图片截取
     * @param srcpath 原始图片file
     * @param topath 输出图片file
     * @param readImageFormat 图片类型("jpg","png"....)
     * @param x1 左上角x坐标
     * @param y1 左上角y坐标
     * @param width 选取图片宽度
     * @param height 选取图片高度
     * @param w 选取图片宽度
     * @param h 选取图片高度
     * @throws IOException 
     */
    public static void CutImageWH(File srcpath,File topath,String readImageFormat, int x1, int y1, int width, int height, int w, int h) throws IOException {
        if (srcpath == null || width==0 || height==0) {
            return ;
        }
        BufferedImage src = ImageIO.read(srcpath);
        int srcw = src.getWidth();
        int srch = src.getHeight();
        //截取图片宽度,截取图片高度
        width = width * srcw / w;
        height = height * srch / h;
        //未缩放原始点
        x1 = (int) (x1 * srcw) / w;
        y1 = (int) (y1 * srch) / h;
        cutimg(srcpath, topath, readImageFormat, x1, y1, width, height);
    }
    
   /**
    * 图片裁剪
    * @param srcfile 原始图片file
    * @param tofile 输出图片file
    * @param imgtype 图片类型("jpg","png"....)
    * @param x 截取点x坐标
    * @param y 截取点y坐标
    * @param width 截取宽度
    * @param height 截取高度
    * @throws IOException 
    */
    public static void cutimg(File srcfile,File tofile,String imgtype,int x,int y,int width,int height)throws IOException{
        FileInputStream fis = null;
        ImageInputStream iis = null;
        try {
            fis = new FileInputStream(srcfile);
            //读取图片文件  
            Iterator it = ImageIO.getImageReadersByFormatName(imgtype);
            ImageReader reader = (ImageReader) it.next();
            //获取图片流   
            iis = ImageIO.createImageInputStream(fis);
            reader.setInput(iis, true);
            ImageReadParam param = reader.getDefaultReadParam();
            //定义一个矩形  
            Rectangle rect = new Rectangle(x,y,width, height);
            //提供一个 BufferedImage，将其用作解码像素数据的目标。   
            param.setSourceRegion(rect);
            BufferedImage bi = reader.read(0, param);
            //保存新图片   
            ImageIO.write(bi, imgtype, tofile);
        }finally {
            if (fis != null) {
                fis.close();
            }
            if (iis != null) {
                iis.close();
            }
        }
    }
    
    /** 
     * 在源图片上设置水印文字 
     * @param srcImagePath  源图片路径 
     * @param alpha 透明度（0<alpha<1） 
     * @param font  字体（例如：宋体） 
     * @param fontStyle     字体格式(例如：普通样式--Font.PLAIN、粗体--Font.BOLD ) 
     * @param fontSize  字体大小 
     * @param color 字体颜色(例如：黑色--Color.BLACK) 
     * @param inputWords        输入显示在图片上的文字 
     * @param x     文字显示起始的x坐标 
     * @param y     文字显示起始的y坐标 
     * @param imageFormat   写入图片格式（png/jpg等） 
     * @param toPath    写入图片路径 
     * @throws IOException  
     */  
    public void alphaWords2Image(String srcImagePath,float alpha,  
            String font,int fontStyle,int fontSize,Color color,  
            String inputWords,int x,int y,String imageFormat,String toPath) throws IOException{  
        FileOutputStream fos=null;  
        try {  
            BufferedImage image = ImageIO.read(new File(srcImagePath));  
            //创建java2D对象  
            Graphics2D g2d=image.createGraphics();  
            //用源图像填充背景  
            g2d.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null, null);  
            //设置透明度  
            AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);  
            g2d.setComposite(ac);  
            //设置文字字体名称、样式、大小  
            g2d.setFont(new Font(font, fontStyle, fontSize));  
            g2d.setColor(color);//设置字体颜色  
            g2d.drawString(inputWords, x, y); //输入水印文字及其起始x、y坐标  
            g2d.dispose();  
            fos=new FileOutputStream(toPath);  
            ImageIO.write(image, imageFormat, fos);  
        } catch (Exception e) {  
           e.printStackTrace();  
        }finally{  
            if(fos!=null){  
                fos.close();  
            }  
        }  
    }  
      
    /** 
     * 在源图像上设置图片水印   
     *  ---- 当alpha==1时文字不透明（和在图片上直接输入文字效果一样） 
     * @param srcImagePath  源图片路径 
     * @param appendImagePath   水印图片路径 
     * @param alpha 透明度 
     * @param x     水印图片的起始x坐标 
     * @param y     水印图片的起始y坐标 
     * @param width 水印图片的宽度 
     * @param height        水印图片的高度 
     * @param imageFormat   图像写入图片格式 
     * @param toPath    图像写入路径 
     * @throws IOException  
     */  
    public void alphaImage2Image(String srcImagePath,String appendImagePath,  
            float alpha,int x,int y,int width,int height,  
            String imageFormat,String toPath) throws IOException{  
        FileOutputStream fos = null;  
        try {  
            BufferedImage image = ImageIO.read(new File(srcImagePath));  
            //创建java2D对象  
            Graphics2D g2d=image.createGraphics();  
            //用源图像填充背景  
            g2d.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null, null);  
            //设置透明度  
            AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);  
            g2d.setComposite(ac);  
            //设置水印图片的起始x/y坐标、宽度、高度  
            BufferedImage appendImage = ImageIO.read(new File(appendImagePath));  
            g2d.drawImage(appendImage, x, y, width, height, null, null);  
            g2d.dispose();  
            fos=new FileOutputStream(toPath);  
            ImageIO.write(image, imageFormat, fos);  
        } catch (Exception e) {  
           e.printStackTrace();  
        }finally{  
            if(fos!=null){  
                fos.close();  
            }  
        }  
    }  
    
}
